package file

import (
	"fmt"
	"github.com/flipped-aurora/gin-vue-admin/server/global"
	"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
	"github.com/flipped-aurora/gin-vue-admin/server/service/file"
	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
	"path/filepath"
	"strings"
)

// FileApi 文件上传相关接口
type FileApi struct{}

// UploadImageFile 上传图片文件
// @Tags File
// @Summary 上传图片文件
// @Security ApiKeyAuth
// @accept multipart/form-data
// @Produce application/json
// @Param file formData file true "上传文件"
// @Param biz query string true "业务类型: community|content|user"
// @Param id query string true "业务ID"
// @Success 200 {object} response.Response{data=map[string]interface{},msg=string} "上传文件,返回包括文件URL,大小,哈希值"
// @Router /upload/image [post]
func (f *FileApi) UploadImageFile(c *gin.Context) {
	// 获取查询参数
	biz := c.Query("biz")
	id := c.Query("id")

	// 验证业务类型和ID是否为空
	if biz == "" || id == "" {
		global.GVA_LOG.Error("业务类型或ID不能为空!")
		response.FailWithMessage("业务类型和ID不能为空", c)
		return
	}

	// 验证业务类型
	if biz != "community" && biz != "content" && biz != "user" {
		global.GVA_LOG.Error("业务类型错误!")
		response.FailWithMessage("业务类型错误，只能是community、content或user", c)
		return
	}

	// 在验证业务类型后添加
	// 检查参数中是否包含路径分隔符或特殊字符
	if strings.ContainsAny(biz, "/\\:") || strings.ContainsAny(id, "/\\:") {
		global.GVA_LOG.Error("参数包含非法字符!")
		response.FailWithMessage("参数不能包含路径分隔符或特殊字符", c)
		return
	}

	// 在获取文件后添加大小检查
	// 获取上传的文件
	_, header, err := c.Request.FormFile("file")
	if err != nil {
		global.GVA_LOG.Error("接收文件失败!", zap.Error(err))
		response.FailWithMessage("接收文件失败", c)
		return
	}

	// 添加文件大小限制（例如10MB）
	const maxFileSize = 10 * 1024 * 1024 // 10MB
	if header.Size > maxFileSize {
		global.GVA_LOG.Error("文件大小超过限制!")
		response.FailWithMessage(fmt.Sprintf("文件大小不能超过%dMB", maxFileSize/1024/1024), c)
		return
	}

	// 添加图片格式验证
	allowedExtensions := map[string]bool{
		".jpg":  true,
		".jpeg": true,
		".png":  true,
		".gif":  true,
		".bmp":  true,
		".webp": true,
	}

	// 获取文件扩展名
	fileExt := strings.ToLower(filepath.Ext(header.Filename))
	if !allowedExtensions[fileExt] {
		global.GVA_LOG.Error("不支持的文件格式!")
		response.FailWithMessage("只支持JPG、PNG、GIF、BMP、WebP等图片格式", c)
		return
	}

	// 调用服务层上传文件
	fileInfo, err := file.FileServiceApp.UploadFile(header, biz, id)
	if err != nil {
		global.GVA_LOG.Error("上传文件失败!", zap.Error(err))
		response.FailWithMessage("上传文件失败", c)
		return
	}

	// 返回结果
	response.OkWithDetailed(fileInfo, "上传成功", c)
}
